#include <functional>
#include <iostream>
#include <boost/asio.hpp>

class printer
{
public:
    printer(boost::asio::io_context& io): timer_(io, boost::asio::chrono::seconds(1)),
        count_(0)
    {
        // boost::asio 的 async_wait 这类异步操作需要的是一个可调用对象（callable）
        // 即一个能在将来被调用的函数或绑定对象，而不是立即执行函数
        //&printer::print：表示成员函数指针。
        //this：绑定当前对象，确保在回调时调用的是该对象的 print 方法。
        //std::bind 会生成一个可调用对象，适配异步回调的签名要求
        timer_.async_wait(std::bind(&printer::print, this));

        //也可以使用 Lambda 来替代 std::bind，语义更清晰
        // timer_.async_wait([this](const boost::system::error_code&) {
        //     this->print();
        // });
    }

    ~printer()
    {
        std::cout << "Final count is " << count_ << std::endl;
    }

    void print()
    {
        if (count_ < 5)
        {
            std::cout << count_ << std::endl;
            ++count_;

            timer_.expires_at(timer_.expiry() + boost::asio::chrono::seconds(1));
            timer_.async_wait(std::bind(&printer::print, this));
        }
    }

private:
    boost::asio::steady_timer timer_;
    int count_;
};

int main()
{
    boost::asio::io_context io;
    printer p(io);
    io.run();
    return 0;
}
